This notebook can be used to generate basic star-coordinate plots [1] of all the Pareto-optimal fronts with suitable colorings and point-sizes. This notebook tests the plot() fucntion from the vis.plotting.star module. All the Pareto-optimal data point files hard-coded in the dictionary pfs. Currently this notebook provides these Pareto-optimal fronts.
[1] Eser Kandogan. 2001. Visualizing Multi-dimensional Clusters, Trends, and Outliers Using Star Coordinates. In Proceedings of the Seventh ACM SIGKDD International Conference on Knowledge Discovery and Data Mining (KDD '01). ACM, New York, NY, USA, 107--116.
%reload_ext autoreload
%autoreload 2
import sys
import os
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams.update({'figure.max_open_warning': 0})
from viz.plotting.utils import resize_by_tradeoff, color_by_dist, color_by_cv, enhance_color, cfs
def load_props(path):
r"""
Load CV, Mu, Ik and S from path.
"""
CV = None
cvpathf = os.path.join(path, "cv.csv")
if os.path.exists(cvpathf):
CV = np.loadtxt(cvpathf)
# load the Mu values
Mu = None
mupathf = os.path.join(path, "mu.csv")
if os.path.exists(mupathf):
Mu = np.loadtxt(mupathf)
# load the knee indices
Ik = None
kpathf = os.path.join(path, "muid.csv")
if os.path.exists(kpathf):
Ik = np.loadtxt(kpathf, dtype=int)
return CV, Mu, Ik
def decide_size_color(pf, dim, CV, Mu, Ik):
r"""
Decide point-size and color from `CV`, `Mu` and `Ik`
"""
# decide point-size
S = 1
if Mu is not None and Ik is not None:
S = resize_by_tradeoff(Mu, k=Ik)
# decide colors
# C = default_color(F.shape[0], alpha=0.5)
M = np.mean(F, axis=0)
C, D = color_by_dist(F, M)
# if CV is available, use CV to color
if CV is not None:
pfname = pf.split('-')[0]
if 'dtlz8' in pfname:
C = color_by_cv(CV, factor=cfs[pfname][int(dim[:-1])])
else:
C = color_by_cv(CV)
# enhance knee points
if Ik is not None:
C = enhance_color(C, Ik)
return S, C, D
%matplotlib inline
from viz.plotting import star
pfs = {'dtlz2': ['3d', '4d', '8d'], \
'dtlz2-nbi': ['3d', '4d', '8d'], \
'debmdk': ['3d', '4d', '8d'], \
'debmdk-nbi': ['3d', '4d', '8d'], \
'debmdk-all': ['3d', '4d', '8d'], \
'debmdk-all-nbi': ['3d', '4d', '8d'], \
'dtlz8': ['3d', '4d', '6d', '8d'], \
'dtlz8-nbi': ['3d', '4d', '6d', '8d'], \
'c2dtlz2': ['3d', '4d', '5d', '8d'], \
'c2dtlz2-nbi': ['3d', '4d', '5d', '8d'], \
'cdebmdk': ['3d', '4d', '8d'], \
'cdebmdk-nbi': ['3d', '4d', '8d'], \
'c0dtlz2': ['3d', '4d', '8d'], \
'c0dtlz2-nbi': ['3d', '4d', '8d'], \
'crash-nbi': ['3d'], 'crash-c1-nbi': ['3d'], 'crash-c2-nbi': ['3d'], \
'carside-nbi': ['3d'], \
'gaa-old': ['10d'], 'gaa-old-nbi': ['10d'], \
'gaa-fmincon': ['10d'], 'gaa-fmincon-nbi': ['10d'], \
'gaa-nsga3': ['10d'], 'gaa-nsga3-nbi': ['10d']}
constrained_pfs = ['dtlz8', 'dtlz8-nbi', 'c2dtlz2', 'c2dtlz2-nbi', 'cdebmdk', 'cdebmdk-nbi', \
'c0dtlz2', 'c0dtlz2-nbi', 'carside-nbi', 'gaa-old', 'gaa-old-nbi', \
'gaa-fmincon', 'gaa-fmincon-nbi', 'gaa-nsga3', 'gaa-nsga3-nbi']
for pf in list(pfs.keys()):
for dim in pfs[pf]:
fullpathf = "../data/{0:s}/{1:s}/f.csv".format(pf, dim)
if os.path.exists(fullpathf):
path, filenamef = os.path.split(fullpathf)
dirs = path.split('/')
frontname = dirs[-2]
# load the front
F = np.loadtxt(fullpathf, delimiter=',')
print(fullpathf, F.shape, dirs, frontname)
# decide color and size
CV, Mu, Ik = load_props(path)
S,C,D = decide_size_color(pf, dim, CV, Mu, Ik)
# make indices for knee and non-knee points
I = np.zeros(F.shape[0]).astype(bool)
I[Ik] = True
Ip, Ik = ~I, I
# fix point labels
L = np.array(["" for _ in range(F.shape[0])]).astype(object)
L[Ip] = "All Other Points"
L[Ik] = "Knee Points"
# decide what label and gradient to use for the colorbar
if pf in constrained_pfs:
cbl = "Normalized Cumulative CV"
cbg = CV
else:
cbl = "Centroid Distance"
cbg = D
figpath = os.path.join(path, "star.pdf")
with plt.rc_context({"text.usetex": True, "font.size": 12}):
star.plot(F, ax=plt.figure().gca(), s=S, c=C, labels=L, colorbar=(C[Ip], cbg[Ip], cbl))
# save the fig
plt.savefig(figpath, bbox_inches='tight', dpi=150)
plt.show()
../data/dtlz2/3d/f.csv (1000, 3) ['..', 'data', 'dtlz2', '3d'] dtlz2
../data/dtlz2/4d/f.csv (2000, 4) ['..', 'data', 'dtlz2', '4d'] dtlz2
../data/dtlz2/8d/f.csv (4000, 8) ['..', 'data', 'dtlz2', '8d'] dtlz2
../data/dtlz2-nbi/3d/f.csv (990, 3) ['..', 'data', 'dtlz2-nbi', '3d'] dtlz2-nbi
../data/dtlz2-nbi/4d/f.csv (1771, 4) ['..', 'data', 'dtlz2-nbi', '4d'] dtlz2-nbi
../data/dtlz2-nbi/8d/f.csv (3432, 8) ['..', 'data', 'dtlz2-nbi', '8d'] dtlz2-nbi
../data/debmdk/3d/f.csv (1047, 3) ['..', 'data', 'debmdk', '3d'] debmdk
../data/debmdk/4d/f.csv (1967, 4) ['..', 'data', 'debmdk', '4d'] debmdk
../data/debmdk/8d/f.csv (4077, 8) ['..', 'data', 'debmdk', '8d'] debmdk
../data/debmdk-nbi/3d/f.csv (1143, 3) ['..', 'data', 'debmdk-nbi', '3d'] debmdk-nbi
../data/debmdk-nbi/4d/f.csv (2028, 4) ['..', 'data', 'debmdk-nbi', '4d'] debmdk-nbi
../data/debmdk-nbi/8d/f.csv (3432, 8) ['..', 'data', 'debmdk-nbi', '8d'] debmdk-nbi
../data/debmdk-all/3d/f.csv (1000, 3) ['..', 'data', 'debmdk-all', '3d'] debmdk-all
../data/debmdk-all/4d/f.csv (2000, 4) ['..', 'data', 'debmdk-all', '4d'] debmdk-all
../data/debmdk-all/8d/f.csv (4000, 8) ['..', 'data', 'debmdk-all', '8d'] debmdk-all
../data/debmdk-all-nbi/3d/f.csv (990, 3) ['..', 'data', 'debmdk-all-nbi', '3d'] debmdk-all-nbi
../data/debmdk-all-nbi/4d/f.csv (1771, 4) ['..', 'data', 'debmdk-all-nbi', '4d'] debmdk-all-nbi
../data/debmdk-all-nbi/8d/f.csv (3432, 8) ['..', 'data', 'debmdk-all-nbi', '8d'] debmdk-all-nbi
../data/dtlz8/3d/f.csv (1038, 3) ['..', 'data', 'dtlz8', '3d'] dtlz8
../data/dtlz8/4d/f.csv (2105, 4) ['..', 'data', 'dtlz8', '4d'] dtlz8
../data/dtlz8/6d/f.csv (2659, 6) ['..', 'data', 'dtlz8', '6d'] dtlz8
../data/dtlz8/8d/f.csv (3680, 8) ['..', 'data', 'dtlz8', '8d'] dtlz8
../data/dtlz8-nbi/3d/f.csv (1025, 3) ['..', 'data', 'dtlz8-nbi', '3d'] dtlz8-nbi
../data/dtlz8-nbi/4d/f.csv (2088, 4) ['..', 'data', 'dtlz8-nbi', '4d'] dtlz8-nbi
../data/dtlz8-nbi/6d/f.csv (3535, 6) ['..', 'data', 'dtlz8-nbi', '6d'] dtlz8-nbi
../data/dtlz8-nbi/8d/f.csv (2277, 8) ['..', 'data', 'dtlz8-nbi', '8d'] dtlz8-nbi
../data/c2dtlz2/3d/f.csv (1086, 3) ['..', 'data', 'c2dtlz2', '3d'] c2dtlz2
../data/c2dtlz2/4d/f.csv (2088, 4) ['..', 'data', 'c2dtlz2', '4d'] c2dtlz2
../data/c2dtlz2/5d/f.csv (2098, 5) ['..', 'data', 'c2dtlz2', '5d'] c2dtlz2
../data/c2dtlz2/8d/f.csv (4305, 8) ['..', 'data', 'c2dtlz2', '8d'] c2dtlz2
../data/c2dtlz2-nbi/3d/f.csv (1036, 3) ['..', 'data', 'c2dtlz2-nbi', '3d'] c2dtlz2-nbi
../data/c2dtlz2-nbi/4d/f.csv (1984, 4) ['..', 'data', 'c2dtlz2-nbi', '4d'] c2dtlz2-nbi
../data/c2dtlz2-nbi/5d/f.csv (2280, 5) ['..', 'data', 'c2dtlz2-nbi', '5d'] c2dtlz2-nbi
../data/c2dtlz2-nbi/8d/f.csv (3872, 8) ['..', 'data', 'c2dtlz2-nbi', '8d'] c2dtlz2-nbi
../data/cdebmdk/3d/f.csv (1099, 3) ['..', 'data', 'cdebmdk', '3d'] cdebmdk
../data/cdebmdk/4d/f.csv (1982, 4) ['..', 'data', 'cdebmdk', '4d'] cdebmdk
../data/cdebmdk/8d/f.csv (3919, 8) ['..', 'data', 'cdebmdk', '8d'] cdebmdk
../data/cdebmdk-nbi/3d/f.csv (1049, 3) ['..', 'data', 'cdebmdk-nbi', '3d'] cdebmdk-nbi
../data/cdebmdk-nbi/4d/f.csv (2042, 4) ['..', 'data', 'cdebmdk-nbi', '4d'] cdebmdk-nbi
../data/cdebmdk-nbi/8d/f.csv (3380, 8) ['..', 'data', 'cdebmdk-nbi', '8d'] cdebmdk-nbi
../data/c0dtlz2/3d/f.csv (1002, 3) ['..', 'data', 'c0dtlz2', '3d'] c0dtlz2
../data/c0dtlz2/4d/f.csv (2003, 4) ['..', 'data', 'c0dtlz2', '4d'] c0dtlz2
../data/c0dtlz2/8d/f.csv (4005, 8) ['..', 'data', 'c0dtlz2', '8d'] c0dtlz2
../data/c0dtlz2-nbi/3d/f.csv (983, 3) ['..', 'data', 'c0dtlz2-nbi', '3d'] c0dtlz2-nbi
../data/c0dtlz2-nbi/4d/f.csv (1916, 4) ['..', 'data', 'c0dtlz2-nbi', '4d'] c0dtlz2-nbi
../data/c0dtlz2-nbi/8d/f.csv (3180, 8) ['..', 'data', 'c0dtlz2-nbi', '8d'] c0dtlz2-nbi
../data/crash-nbi/3d/f.csv (1327, 3) ['..', 'data', 'crash-nbi', '3d'] crash-nbi
../data/crash-c1-nbi/3d/f.csv (274, 3) ['..', 'data', 'crash-c1-nbi', '3d'] crash-c1-nbi
../data/crash-c2-nbi/3d/f.csv (1053, 3) ['..', 'data', 'crash-c2-nbi', '3d'] crash-c2-nbi
../data/carside-nbi/3d/f.csv (592, 3) ['..', 'data', 'carside-nbi', '3d'] carside-nbi
../data/gaa-old/10d/f.csv (3112, 10) ['..', 'data', 'gaa-old', '10d'] gaa-old
../data/gaa-old-nbi/10d/f.csv (3112, 10) ['..', 'data', 'gaa-old-nbi', '10d'] gaa-old-nbi
../data/gaa-fmincon/10d/f.csv (3461, 10) ['..', 'data', 'gaa-fmincon', '10d'] gaa-fmincon
../data/gaa-fmincon-nbi/10d/f.csv (3566, 10) ['..', 'data', 'gaa-fmincon-nbi', '10d'] gaa-fmincon-nbi
../data/gaa-nsga3/10d/f.csv (1966, 10) ['..', 'data', 'gaa-nsga3', '10d'] gaa-nsga3
../data/gaa-nsga3-nbi/10d/f.csv (1871, 10) ['..', 'data', 'gaa-nsga3-nbi', '10d'] gaa-nsga3-nbi